//package com.wyt.spark.clickhouse.reference
//
//import java.sql.{PreparedStatement, ResultSet}
//import java.util.Properties
//
//import com.github.housepower.jdbc.ClickHouseConnection
//import com.github.housepower.jdbc.settings.ClickHouseConfig
//
//import scala.collection.mutable.ArrayBuffer
//
///**
//  * ClickHouse Native JDBC 工具类
//  * @author zhangdongwei
//  * @create 2020-07-29-10:28
//  */
//@Deprecated
//Object ClickHouseNJUtils {
//
//  /**
//    * 获取ClickHouse连接（不需要认证）
//    *
//    * @param ckUrl 连接url
//    */
//  def getCkConnection(ckUrl: String): ClickHouseConnection = {
//    Class.forName("com.github.housepower.jdbc.ClickHouseDriver")
//    val properties = new Properties()
//    properties.put("user", "default")
//    properties.put("password", "")
//    properties.put("database", "default")
//    val config = new ClickHouseConfig(ckUrl, properties)
//    ClickHouseConnection.createClickHouseConnection(config)
//  }
//
//  /**
//    * 创建ReplicatedMergeTree引擎表
//    * @param connection
//    * @param cluster
//    * @param database
//    * @param table
//    * @param fields
//    * @param partitionColumns
//    * @param indexColumns
//    */
//  def createReplicatedMergeTreeTable(connection: ClickHouseConnection,
//                                     cluster: String,
//                                     database: String,
//                                     table: String,
//                                     fields: Array[Tuple2[String,String]],
//                                     partitionColumns: Array[String],
//                                     indexColumns: Array[String]
//                                    ): Unit ={
//    val partitionStr = if(partitionColumns.isEmpty) "" else s"PARTITION BY (${partitionColumns.mkString(",")})"
//    val orderbyStr = if(indexColumns.isEmpty) "" else s"ORDER BY (${indexColumns.mkString(",")})"
//    //1.创建表
//    val createSql =
//      s"""
//         |CREATE TABLE IF NOT EXISTS $database.$table ON CLUSTER $cluster
//         |(
//         |  ${getCreateFields(fields)}
//         |)
//         |ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/${database}_$table','{replica}')
//         |$partitionStr
//         |$orderbyStr
//       """.stripMargin
//    println(s"createSql: $createSql")
//    val pstmt: PreparedStatement = connection.prepareStatement(createSql)
//    pstmt.executeUpdate()
//    closePrepareStatement(pstmt)
//  }
//
//  def createDistributedTable(connection: ClickHouseConnection,
//                             cluster: String,
//                             database: String,
//                             table: String
//                            ): Unit ={
//    //1.创建表
//    val tabelDistributed = s"${table}_distributed"
//    val createSql =
//      s"""
//         |CREATE TABLE IF NOT EXISTS ${database}.${tabelDistributed} ON CLUSTER $cluster
//         |AS ${database}.${table}
//         |ENGINE = Distributed(${cluster}, ${database}, ${table}, rand())
//       """.stripMargin
//    println(s"createSql: $createSql")
//    val pstmt: PreparedStatement = connection.prepareStatement(createSql)
//    pstmt.executeUpdate()
//    closePrepareStatement(pstmt)
//  }
//
//
//  /**
//    * 清空表
//    * @param connection
//    * @param cluster
//    * @param database
//    * @param table
//    * @return
//    */
//  def   truncateTable(connection: ClickHouseConnection, cluster: String, database: String, table: String) = {
//    //1.删除表
//    val dropSql = s"TRUNCATE TABLE IF EXISTS $database.$table ON CLUSTER $cluster"
//    val pstmt: PreparedStatement = connection.prepareStatement(dropSql)
//    pstmt.executeUpdate()
//    closePrepareStatement(pstmt)
//  }
//
//  /**
//    * 对表进行ALTER操作
//    * @param connection
//    * @param cluster
//    * @param database
//    * @param table
//    * @return
//    */
//  def alterTable(connection: ClickHouseConnection, cluster: String, database: String, table: String, alterSql: String) = {
//    val pstmt: PreparedStatement = connection.prepareStatement(alterSql)
//    pstmt.executeUpdate()
//    closePrepareStatement(pstmt)
//  }
//
//  /**
//    * 删除表
//    * @param connection
//    * @param database
//    * @param table
//    * @param cluster
//    */
//  def dropTable(connection: ClickHouseConnection, cluster: String, database: String, table: String) = {
//    //1.删除表
//    val dropSql = s"DROP TABLE IF EXISTS $database.$table ON CLUSTER $cluster"
//    val pstmt: PreparedStatement = connection.prepareStatement(dropSql)
//    pstmt.executeUpdate()
//    //2.上面执行executeUpdate也无法保证表创建成功，所以需要循环查询system.tables表，确认表是否创建成功
//    var isDrop = false
//    var pstmt1: PreparedStatement = null
//    while(!isDrop){
//      Thread.sleep(1000)
//      val querySql =
//        s"""
//           |SELECT database,name,engine
//           |FROM system.tables
//           |WHERE database='$database' AND name='$table'
//       """.stripMargin
//      pstmt1 = connection.prepareStatement(querySql)
//      val rs: ResultSet = pstmt1.executeQuery()
//      if(!rs.next()){
//        isDrop = true
//        println(s"表${database}.${table}已经被删除...")
//      }else{
//        println(s"表${database}.${table}尚未被删除...")
//      }
//    }
//    closePrepareStatement(pstmt)
//    closePrepareStatement(pstmt1)
//  }
//
//  def closePrepareStatement(pstmt: PreparedStatement) = {
//    if(pstmt != null) {
//      pstmt.close()
//    }
//  }
//
//  def closeCkConnection(conn: ClickHouseConnection) = {
//    if(conn != null) {
//      conn.close()
//    }
//  }
//
//
//  /**
//    * 获取创建ck表的字段语句
//    *
//    * @param df DataFrame
//    */
//  private def getCreateFields(fields: Array[Tuple2[String,String]]): String = {
//    var arr = ArrayBuffer[String]()
//    for (field <- fields) {
//      arr += (field._1 + " " + field._2)
//    }
//    arr.mkString(",\n")
//  }
//
//  def main(args: Array[String]): Unit = {
//    //    //1.创建connection
//    //    val ckUrl = "jdbc:clickhouse://hnode22:9001/default?connect_timeout=1000"
//    //    val connection: ClickHouseConnection = getCkConnection(ckUrl)
//    //    //2.初始化fileds、partitionColumns、indexColumns
//    //    val fields = Array(
//    //      Tuple2[String, String]("id", "UInt64"),
//    //      Tuple2[String, String]("name", "String"),
//    //      Tuple2[String, String]("age", "UInt32")
//    //    )
//    //    val partitionColumns = Array[String]("id")
//    //    val indexColumns = Array[String]("id","name")
//    //    //3.创建ReplicateMergeTreeTable
//    //    createReplicatedMergeTreeTable(
//    //      connection,
//    //      "ck_cluster",
//    //      "test1",
//    //      "student",
//    //      fields,
//    //      partitionColumns,
//    //      indexColumns)
//    //
//    //    //1.删除ReplicatedMergeTree表
//    ////    dropTable(connection,"ck_cluster","test1","student")
//    //
//    //    //1.创建Distributed表
//    //    createDistributedTable(connection,"ck_cluster","test1","student")
//
//    //1.删除Distributed表
//    //    dropTable(connection,"ck_cluster","test1","student_distributed")
//  }
//
//}
